﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace dev173d
{
    class Sala
    {
        BasicPrimitive chao;
        BasicPrimitive teto;
        BasicPrimitive parede_frente_dir;
        BasicPrimitive parede_frente_esq;
        BasicPrimitive cima_da_porta_ou_janela;
        BasicPrimitive baixo_da_janela;
        BasicPrimitive parede_direita_esq;
        BasicPrimitive parede_direita_dir;
        BasicPrimitive parede_esquerda_esq;
        BasicPrimitive parede_esquerda_dir;
        BasicPrimitive parede_tras_esq;
        BasicPrimitive parede_tras_dir;

        //TODO criar classes parede com porta e parede com janela;

        public Sala(GraphicsDevice graphicsDevice, ContentManager Content)
        {
            chao = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/chaopedras"), Color.White);
            teto = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/texturateto"), Color.White);
            parede_frente_dir = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/WallHD"), Color.White);
            parede_frente_esq = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/Parede"), Color.White);
            parede_direita_esq = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/WallHD"), Color.White);
            parede_direita_dir = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/Parede"), Color.White);
            parede_esquerda_esq = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/WallHD"), Color.White);
            parede_esquerda_dir = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/WallHD"), Color.White);
            parede_tras_esq = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/WallHD"), Color.White);
            parede_tras_dir = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/WallHD"), Color.White);
            baixo_da_janela = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/Parede"), Color.White);
            cima_da_porta_ou_janela = new BasicPrimitive(graphicsDevice, Content.Load<Texture2D>("Cenario/Parede"), Color.White);

            //ConfigurarSalaSemJanelaComPorta();
            CriarSala();
        }

        public void ConfigurarSalaSemJanelaNemPorta()
        {
            //chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
            //    * Matrix.CreateScale(10) *
            //    Matrix.CreateTranslation(0, -1.5f, 0);

            //teto.World = Matrix.CreateRotationX(MathHelper.ToRadians(90.0f))
            //    * Matrix.CreateScale(10) *
            //    Matrix.CreateTranslation(0, 1.5f, 0);

            //parede_frente_dir.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
            //    Matrix.CreateScale(10, 3.5f, 1) * //o meio é pra esconder um defeito na imagem
            //    Matrix.CreateTranslation(0, 0, -5f);

            //parede_direita_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(270.0f))//=-90
            //    * Matrix.CreateScale(1, 3.5f, 10) * //reparem como os eixos de escala tiveram que mudar
            //    Matrix.CreateTranslation(5f, 0, 0);

            //parede_esquerda_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(-270.0f))//=90
            //    * Matrix.CreateScale(1, 3.5f, 10) * //reparem como os eixos de escala tiveram que mudar
            //    Matrix.CreateTranslation(-5f, 0, 0);

            //parede_tras_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(180.0f))//rotação total
            //   * Matrix.CreateScale(10, 3.5f, 1) * //não seria melhor deixar a rotação para todos, mesmo que seja 0, para padronizar?
            //   Matrix.CreateTranslation(0, 0, 5f);

            chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
                * Matrix.CreateScale(10) *
                Matrix.CreateTranslation(0, -1.5f, 0);

            teto.World = Matrix.CreateRotationX(MathHelper.ToRadians(90.0f))
                * Matrix.CreateScale(10) *
                Matrix.CreateTranslation(0, 1.5f, 0);

            parede_frente_dir.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
                Matrix.CreateScale(10, 3.5f, 1) * //o meio é pra esconder um defeito na imagem
                Matrix.CreateTranslation(0, 0, -5f);

            parede_direita_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(270.0f))//=-90
                * Matrix.CreateScale(1, 3.5f, 10) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(5f, 0, 0);

            parede_esquerda_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(-270.0f))//=90
                * Matrix.CreateScale(1, 3.5f, 10) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(-5f, 0, 0);

            parede_tras_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(180.0f))//rotação total
               * Matrix.CreateScale(10, 3.5f, 1) * //não seria melhor deixar a rotação para todos, mesmo que seja 0, para padronizar?
               Matrix.CreateTranslation(0, 0, 5f);


        }

        public void ConfigurarSalaSemJanelaComPorta()
        {
            //chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
            //    * Matrix.CreateScale(50) *
            //    Matrix.CreateTranslation(0, -3.5f, -10);

            chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
                * Matrix.CreateScale(50) *
                Matrix.CreateTranslation(0, -3.5f, -10);

            teto.World = Matrix.CreateRotationX(MathHelper.ToRadians(90.0f))
                * Matrix.CreateScale(50) *
                Matrix.CreateTranslation(0, 4.5f, -10);

            parede_frente_dir.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
                Matrix.CreateScale(10, 8f, 1) * //o meio é pra esconder um defeito na imagem
                Matrix.CreateTranslation(5, 0, -5f);

            parede_frente_esq.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
                Matrix.CreateScale(10, 8f, 1) * //o meio é pra esconder um defeito na imagem
                Matrix.CreateTranslation(-10f, 0, -5f);

            parede_direita_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(270.0f))//=-90
                * Matrix.CreateScale(1001, 8f, 10) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(10f, 0f, 0);

            parede_esquerda_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(-270.0f))//=90
                * Matrix.CreateScale(151, 10f, 10) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(-25f, 0, 10);

            parede_tras_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(180.0f))//rotação total
               * Matrix.CreateScale(10, 8f, 1) * //não seria melhor deixar a rotação para todos, mesmo que seja 0, para padronizar?
               Matrix.CreateTranslation(0, 0, 5f);
        }

        public void ConfigurarSalaComJanelaEComPorta()
        {
            chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
                * Matrix.CreateScale(10) *
                Matrix.CreateTranslation(0, -1.5f, 0);

            teto.World = Matrix.CreateRotationX(MathHelper.ToRadians(90.0f))
                * Matrix.CreateScale(10) *
                Matrix.CreateTranslation(0, 1.5f, 0);

            parede_frente_dir.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
                Matrix.CreateScale(4, 3.5f, 1) * //o meio é pra esconder um defeito na imagem
                Matrix.CreateTranslation(3, 0, -5f);

            parede_frente_esq.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
                Matrix.CreateScale(4, 3.5f, 1) * //o meio é pra esconder um defeito na imagem
                Matrix.CreateTranslation(-3, 0, -5f);

            parede_direita_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(270.0f))//=-90
                * Matrix.CreateScale(1, 3.5f, 10) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(5f, 0, 0);

            parede_esquerda_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(-270.0f))//=90
                * Matrix.CreateScale(1, 3.5f, 10) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(-5f, 0, 0);

            parede_tras_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(180.0f))//rotação total
               * Matrix.CreateScale(10, 3.5f, 1) * //não seria melhor deixar a rotação para todos, mesmo que seja 0, para padronizar?
               Matrix.CreateTranslation(0, 0, 5f);
        }


        public void CriarSala()
        {
            //chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
            //    * Matrix.CreateScale(50) *
            //    Matrix.CreateTranslation(0, -3.5f, -10);

            chao.World = Matrix.CreateRotationX(MathHelper.ToRadians(-90.0f))
                * Matrix.CreateScale(5) *
                Matrix.CreateTranslation(0, -3.5f, -10);

            teto.World = Matrix.CreateRotationX(MathHelper.ToRadians(90.0f))
                * Matrix.CreateScale(50) *
                Matrix.CreateTranslation(0, 4.5f, -10);

            parede_frente_dir.World = 
                Matrix.CreateScale(5.5f, 1.5f, 5) *  Matrix.CreateTranslation(5, 0, -65f);

            parede_frente_esq.World = /*Matrix.CreateRotationX(MathHelper.ToRadians(90.0f)) * */
                Matrix.CreateScale(10, 8f, 1) * //o meio é pra esconder um defeito na imagem
                Matrix.CreateTranslation(-10f, 0, -5f);

            parede_direita_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(270.0f))//=90
                * Matrix.CreateScale(1.5f, 1.5f, 5) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(50f, 0, -10);

            parede_esquerda_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(-270.0f))//=90
                * Matrix.CreateScale(1.5f,1.5f,5) * //reparem como os eixos de escala tiveram que mudar
                Matrix.CreateTranslation(-55f, 0, -10);

            parede_tras_esq.World = Matrix.CreateRotationY(MathHelper.ToRadians(180.0f))
               * Matrix.CreateScale(5, 1.5f, 1) * Matrix.CreateTranslation(2, 0, 47f);
        }



        public void Update(GameTime gameTime)
        {
           /* chao.Update(gameTime);
            teto.Update(gameTime);
            parede_frente.Update(gameTime);
            parede_direita.Update(gameTime);
            parede_esquerda.Update(gameTime);
            parede_tras.Update(gameTime);*/
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch, BasicCamera camera)
        {
            chao.Draw(gameTime, camera);
          //  teto.Draw(gameTime, camera);
            parede_frente_dir.Draw(gameTime, camera);
          //  parede_frente_esq.Draw(gameTime, camera);
            parede_direita_esq.Draw(gameTime, camera);
            parede_esquerda_esq.Draw(gameTime, camera);
            parede_tras_esq.Draw(gameTime, camera);
 
        }
    }
}
